package com.coolrui.common.system;

import com.coolrui.common.enums.ResultCodeEnum;
import lombok.Data;

/**
 * API返回结果格式
 */
@Data
public class ApiResult<T> {
    private Integer code; // 返回状态码
    private String msg;   // 返回描述信息
    private T data;       // 返回数据

    /**
     * 使用结果枚举和数据创建 API 结果对象
     *
     * @param code 结果枚举，包含状态码和描述信息
     * @param data 返回的数据
     * @param <T>  数据的泛型类型
     * @return 封装好的 API 结果对象
     */
    public static <T> ApiResult<T> makeResult(ResultCodeEnum code, T data) {
        return makeResult(code, code.getMessage(), data);
    }

    /**
     * 使用结果枚举和自定义消息创建 API 结果对象
     *
     * @param code 结果枚举，包含状态码
     * @param msg  自定义的描述信息
     * @param <T>  数据的泛型类型
     * @return 封装好的 API 结果对象
     */
    public static <T> ApiResult<T> makeResult(ResultCodeEnum code, String msg) {
        return makeResult(code, msg, null);
    }

    /**
     * 使用结果枚举、自定义消息和数据创建 API 结果对象
     *
     * @param code 结果枚举，包含状态码
     * @param msg  自定义的描述信息
     * @param data 返回的数据
     * @param <T>  数据的泛型类型
     * @return 封装好的 API 结果对象
     */
    public static <T> ApiResult<T> makeResult(ResultCodeEnum code, String msg, T data) {
        if (code == null) {
            throw new IllegalArgumentException("ResultCodeEnum cannot be null");
        }
        ApiResult<T> result = new ApiResult<>();
        result.code = code.getCode();
        result.msg = msg;
        result.data = data;
        return result;
    }

    /**
     * 使用整数状态码、自定义消息和数据创建 API 结果对象
     *
     * @param code 整数状态码
     * @param msg  自定义的描述信息
     * @param data 返回的数据
     * @param <T>  数据的泛型类型
     * @return 封装好的 API 结果对象
     */
    public static <T> ApiResult<T> makeResult(Integer code, String msg, T data) {
        if (code == null) {
            throw new IllegalArgumentException("Code cannot be null");
        }
        ApiResult<T> result = new ApiResult<>();
        result.code = code;
        result.msg = msg;
        result.data = data;
        return result;
    }
}